package ctrlayer;
import modellayer.*;

import java.util.ArrayList;
import java.io.*;
import java.math.BigInteger;
/**
 * Write a description of class PersonCtr here.
 * 
 * @author (Kasper) 
 * @version (05.12.2014)
 */
public class PersonCtr
{
    private AnsatCont aCon;
    private KundeCont kCon;
    private static Ansat bruger;

    /**
     * Constructor for objects of class PersonCtr
     */
    public PersonCtr()
    {
        aCon = aCon.getInstance();
        kCon = kCon.getInstance();
    }

    /**
     * Method createAnsat
     * 
     * Creates an employee and adds it to the ArrayList ansatte
     *
     * @param navn A parameter
     * @param adresse A parameter
     * @param postnr A parameter
     * @param by A parameter
     * @param tlf A parameter
     * @param email A parameter
     * @return True if the employee is created. False if not.
     */
    public boolean createMedarbejder(String navn, String adresse, String postnr, String by, String tlf, String email)
    {
        Ansat a = null;

        if(aCon.findAnsatViaTelefon(tlf)== null)
        {
            a = new Medarbejder(navn, adresse, postnr, by, tlf, email);
            ((Medarbejder)a).setMedarbejderLogin(navn.substring(0,3).trim().toLowerCase() + a.getMedarbejderNr());
            ((Medarbejder)a).setPassword(tlf);
            aCon.addAnsat(a);

            return true;
        }
        else
        {
            return false;
        }
    }
    
    public ArrayList<Kunde> getKundeList()
    {
    	return kCon.getList();
    }
    
    public ArrayList<Ansat> getAnsatList()
    {
    	return aCon.getList();
    }
    
    public ArrayList<Kunde> findKunderList()
    {
    	return kCon.getFindKunder();
    }
    
    public Ansat getBruger()
    {
    	return bruger;
    }
    
    public void setBruger(Ansat a)
    {
    	bruger = a;
    }
    
    public void medarbejderNoCounterCheck()
    {
        if(!aCon.getList().isEmpty())
        {
            for(int i = 0; i < aCon.getList().size(); i++)
            {
                Ansat a = aCon.getList().get(i); 
                if(a.getMedarbejderNr() > a.getStaticCounter())
                {
                    a.ansatNoCounter();
                }
            }
        }
    }

    /**
     * Method createLeder
     *
     * Creates a boss and adds it to the ArrayList ansatte
     * 
     * @param navn A parameter
     * @param adresse A parameter
     * @param postnr A parameter
     * @param by A parameter
     * @param tlf A parameter
     * @param email A parameter
     * @param lederLogin A parameter
     * @return True if the employee is created. False if not.
     */
    public boolean createLeder(String navn, String adresse, String postnr, String by, String tlf, String email)
    {
        Ansat a = null;

        if(aCon.findAnsatViaTelefon(tlf)== null)
        {
            a = new Leder(navn, adresse, postnr, by, tlf, email);
            ((Leder)a).setLederLogin(navn.substring(0,3).trim().toLowerCase() + a.getMedarbejderNr());
            ((Leder)a).setPassword(tlf);
            aCon.addAnsat(a);

            return true;
        }
        else
        {
            return false;
        }
    }

    /**
     * Method findAnsat
     * 
     * Searches for an employee from the given employee id
     *
     * @param medarbejderNr A parameter
     * @return An employee
     */
    public Ansat findAnsat(int medarbejderNr)
    {
        return aCon.findAnsat(medarbejderNr);
    }
    
    public Ansat findAnsatViaTlf(String tlf)
    {
    	return aCon.findAnsatViaTelefon(tlf);
    }

    /**
     * Method updateAnsat
     * 
     * Searches for an employee with the given id, and updates the employee with the given parameters
     *
     * @param medarbejderNr A parameter
     * @param navn A parameter
     * @param adresse A parameter
     * @param postnr A parameter
     * @param by A parameter
     * @param tlf A parameter
     * @param email A parameter
     * @param login A parameter
     * @param password A parameter
     * @return The return value
     */
    public boolean updateAnsat(int medarbejderNr, int newMedarbejderNr, String navn, String adresse, String postnr, String by, String tlf, String email, String password)
    {
        if(findAnsat(medarbejderNr) == null)
        {
            return false;
        }
        else
        {
            aCon.updateAnsat(medarbejderNr, newMedarbejderNr, navn, adresse, postnr, by, tlf, email, password);
            return true;
        }
    }

    /**
     * Method deleteAnsat
     *
     * Deletes an employee that matches the given id
     * 
     * @param medarbejderNr A parameter
     * @return False if the emloyee coulnd't be found. True if the employee is deleted.
     */
    public boolean deleteAnsat(int medarbejderNr)
    {
        if(findAnsat(medarbejderNr) == null)
        {
            return false;
        }
        else
        {
            aCon.deleteAnsat(medarbejderNr);
            return true;
        }
    }

    /**
     * Method printAnsatInfo
     *
     * Prints employee info
     */
    public void printAnsatInfo()
    {
        aCon.printInfo();
    }

    public void saveAnsat() throws IOException
    {
        aCon.saveToFile();
    }

    public void loadAnsat() throws IOException, ClassNotFoundException
    {
        aCon.loadFromFile();
    }

    /**
     * Method createKunde
     *
     * Creates a customer and adds it to the ArrayList kunder
     * 
     * @param navn A parameter
     * @param adresse A parameter
     * @param postnr A parameter
     * @param by A parameter
     * @param tlf A parameter
     * @param email A parameter
     * @param kundeLogin A parameter
     * @return True if the customer is created. False if not.
     */
    public boolean createKunde(String navn, String adresse, String postnr, String by, String tlf, String email)
    {
        Kunde k = null;

        if(findKunde(tlf) == null)
        {
            k = new Kunde(navn, adresse, postnr, by, tlf, email);
            kCon.addKunde(k);

            return true;
        }
        else
        {
            return false;
        }
    }
    
    public void kundeNoCounterCheck()
    {
        if(!kCon.getList().isEmpty())
        {
            for(int i = 0; i < kCon.getList().size(); i++)
            {
                Kunde k = kCon.getList().get(i); 
                if(k.getKundeNr() > k.getStaticCounter())
                {
                    k.kundeNoCounter();
                }
            }
        }
    }

    /**
     * Method createFastKunde
     *
     * Creates a regular customer and adds it to the Arraylist kunder
     * 
     * @param navn A parameter
     * @param adresse A parameter
     * @param postnr A parameter
     * @param by A parameter
     * @param tlf A parameter
     * @param email A parameter
     * @param kontonr A parameter
     * @param kundegrp A parameter
     * @return True if the customer is created. False if not.
     */
    public boolean createFastKunde(String navn, String adresse, String postnr, String by, String tlf, String email, Long kontonr, int kundegrp)
    {
        FastKunde fk = null;

        if(findKunde(tlf) == null)
        {
            fk = new FastKunde(navn, adresse, postnr, by, tlf, email, kontonr, kundegrp);
            kCon.addKunde(fk);

            return true;
        }
        else
        {
            return false;
        }
    }

    /**
     * Method findKunde
     *
     * Searches for a customer from the given phone number
     * 
     * @param tlf Phone Number
     * @return A customer
     */
    public Kunde findKunde(String tlf)
    {
        return kCon.findKunde(tlf);
    }
    
    public Kunde findKundeViaNavn(String navn)
    {
    	return kCon.findKundeViaNavn(navn);
    }

    /**
     * Method updateKunde
     *
     * Searches for a customer with the given phone number, and updates that customer with the given parameters
     * @param oldTlf A parameter
     * @param navn A parameter
     * @param adresse A parameter
     * @param postnr A parameter
     * @param by A parameter
     * @param tlf A parameter
     * @param email A parameter
     * @param kontonr A parameter
     * @param kundegrp A parameter
     * @return False if the customer couldn't be found. True if the customer is updated
     */
    public boolean updateKunde(String oldTlf, String navn, String adresse, String postnr, String by, String tlf, String email, Long kontonr, int kundegrp)
    {
        if(findKunde(oldTlf) == null)
        {
            return false;
        }
        else
        {
            kCon.updateKunde(oldTlf, navn, adresse, postnr, by, tlf, email, kontonr, kundegrp);
            return true;
        }
    }

    /**
     * Method deleteKunde
     *
     * Deletes a customer that matches the given phone number
     * 
     * @param tlf A parameter
     * @return False if the customer couldn't be found. True if the customer was removed.
     */
    public boolean deleteKunde(String tlf)
    {
        if(findKunde(tlf) == null)
        {
            return false;
        }
        else
        {
            kCon.deleteKunde(tlf);
            return true;
        }
    }

    /**
     * Method konverterKunde
     *
     * Converts a customer to a regular customer with an account and a customergroup
     * 
     * @param tlf A parameter
     * @param kontonr A parameter
     * @param kundegrp A parameter
     * @return False if the customer wasn't found. True if if the customer was found, deleted and created as a regular customer. 
     */
    public boolean konverterKunde(String tlf, Long kontonr, int kundegrp)    
    {
        if(findKunde(tlf) == null)
        {
            return false;
        }
        else
        {
            Kunde k = findKunde(tlf);
            String navn = k.getNavn();
            String adresse = k.getAdresse();
            String postnr = k.getPostnr();
            String by = k.getBy();
            String email = k.getEmail();
            deleteKunde(tlf);
            createFastKunde(navn, adresse, postnr, by, tlf, email, kontonr, kundegrp);

            return true;
        }
    }

    /**
     * Method printKundeInfo
     * 
     * Prints customer info
     *
     */
    public void printKundeInfo()
    {
        kCon.printInfo();
    }

    public Kunde findKundeOrdreNr(int ordreNr)
    {
        return kCon.findKundeOrdreNr(ordreNr);
    }

    /**
     * Method findLoggetInd
     *
     * Checks who is logged in with the given login name.
     * 
     * @param brugernavn 
     * @return String s with the medarbejderNr of the employee that is logged in.
     */
    public String findLoggetInd(String brugernavn)
    {
        int i = 0;
        boolean found = false;
        Ansat ansat =aCon.getList().get(i);
        while(!found && i < aCon.getList().size())
        {
            ansat =aCon.getList().get(i);
            if(ansat instanceof Medarbejder)
            {
                if(((Medarbejder)ansat).getMedarbejderLogin().equals(brugernavn))
                {
                    found = true;
                }
                else
                {
                    i++;
                }
            }
            else if(ansat instanceof Leder)
            {
                if(((Leder)ansat).getLederLogin().equals(brugernavn))
                {
                    found = true;
                }
                else
                {
                    i++;
                }
            }
        }
        int j = ansat.getMedarbejderNr();
        String s = new Integer(j).toString();
        return s;
    }

    /**
     * Method kontrolLogin
     *
     * Checks wether or not the login and password is from the same employee.
     * 
     * @param brugernavn A parameter
     * @param password A parameter
     * @return True if an employee with the given login and password is found. False if not.
     */
    public boolean kontrolLogin(String brugernavn, String password)
    {
        int i = 0;
        boolean found = false;
        ArrayList<Ansat> pList = aCon.getList();
        while(!found && i < pList.size())
        {
            Ansat ansat = pList.get(i);
            if(ansat instanceof Medarbejder)
            {
                if(((Medarbejder)ansat).getMedarbejderLogin().equals(brugernavn))
                {
                    if(kontrolPassword(ansat, password))
                    {
                    	setBruger(ansat);
                        found = true;
                    }
                    else
                    {
                        break;
                    }
                }
                else
                {
                    i++;
                }
            }
            else if(ansat instanceof Leder)
            {
                if(((Leder)ansat).getLederLogin().equals(brugernavn))
                {
                    if(kontrolPassword(ansat, password))
                    {
                    	setBruger(ansat);
                        found = true;
                    }
                    else
                    {
                        break;
                    }
                }
                else
                {
                    i++;
                }
            }
            else
            {
                System.out.println("Brugernavn findes ikke!");
            }
        }
        return found;
    }
    

    /**
     * Method kontrolPassword
     *
     * Checks wether or not the given password is on the given employee.
     * 
     * @param ansat A parameter
     * @param password A parameter
     * @return True if there is a match. False if not.
     */
    public boolean kontrolPassword(Ansat ansat, String password)
    {
        int i = 0;
        boolean match = false;
        if(((Person)ansat).getPassword().equals(password))
        {
            match = true;
        }
        return match;
    }
	
    public void saveKunde() throws IOException
    {
        kCon.saveToFile();
    }

    public void loadKunde() throws IOException, ClassNotFoundException
    {
        kCon.loadFromFile();
    }
}
